import java.awt.EventQueue;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.SocketException;

import Barrera.barrier;
import Cliente.Cliente;
//import Hilo.hilo;
import Servidor.Servidor;
import Socket.SocketBytes;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;

import java.awt.Color;
import javax.swing.UIManager;
import javax.swing.border.MatteBorder;
import java.awt.Font;

import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.JSpinner;
import javax.swing.DefaultComboBoxModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingUtilities;

public class JuegoServidor extends JFrame implements ActionListener {
	private JPanel contentPane;
	private JButton btnUnirse;
	private JButton btnCrear;
	private JButton btnAceptarSer;
	private JButton btnAceptarJug;
	private JPanel panel3juego;
	private JPanel panel2juego; // jugador
	private cargando panelCargando;
	private static Servidor panelServidor; 
	private static final long serialVersionUID = 1L;
	private final JPanel panel1juego = new JPanel();
	private JPanel panel_2;
	private JTextField textFieldNum;
	private JTextField textFieldName;
	
	// servidor
	private JPanel servidor;
	private JPanel panelJugador1;
	private JPanel panelJugador2;
	private JTextArea areaPantalla;
	public JButton btnIniciarJuego;	
	
	private String nombre;
	private String numero;
	
	public JuegoServidor() throws Exception {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 633, 455);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);	
		
		
		
		// panel servidor
		servidor = new JPanel();
		servidor.setBounds(0, 0, 633, 433);
		servidor.setLayout(null);
		contentPane.add(servidor);
		
		JPanel panelBarra = new JPanel();
		panelBarra.setBounds(0, 344, 633, 89);
		add(panelBarra);
		panelBarra.setBorder(new MatteBorder(3, 2, 2, 2, (Color) new Color(0, 0, 0)));
		panelBarra.setBackground(Color.GRAY);
		panelBarra.setLayout(null);
		
		JLabel lblJugadores = new JLabel("Jugadores");
		lblJugadores.setFont(new Font("Marker Felt", Font.PLAIN, 13));
		lblJugadores.setBounds(532, 21, 61, 16);
		panelBarra.add(lblJugadores);
		
		panelJugador1 = new JPanel();
		panelJugador1.setBorder(new LineBorder(new Color(0, 0, 0)));
		panelJugador1.setBackground(Color.RED);
		panelJugador1.setBounds(542, 45, 10, 10);
		panelBarra.add(panelJugador1);
		
		panelJugador2 = new JPanel();
		panelJugador2.setBackground(Color.RED);
		panelJugador2.setBorder(new LineBorder(new Color(0, 0, 0)));
		panelJugador2.setBounds(563, 45, 10, 10);
		panelBarra.add(panelJugador2);
		
		JLabel lblMaxJug = new JLabel("M\u00E1ximos jugadores: 2");
		lblMaxJug.setFont(new Font("Marker Felt", Font.PLAIN, 13));
		lblMaxJug.setBounds(253, 21, 115, 16);
		panelBarra.add(lblMaxJug);
		
		JLabel lblPuertoEs = new JLabel("Puerto de escucha: 9999");
		lblPuertoEs.setFont(new Font("Marker Felt", Font.PLAIN, 13));
		lblPuertoEs.setBounds(253, 56, 140, 16);
		panelBarra.add(lblPuertoEs);
		
		btnIniciarJuego = new JButton("Iniciar juego");
		btnIniciarJuego.setFont(new Font("Marker Felt", Font.PLAIN, 15));
		btnIniciarJuego.setBounds(38, 21, 117, 49);
		panelBarra.add(btnIniciarJuego);
		btnIniciarJuego.addActionListener(this);
		
		JPanel panel4 = new JPanel();
		panel4.setBounds(0, 0, 633, 343);
		add(panel4);
		panel4.setLayout(null);
		
		JLabel lblModo = new JLabel("Modo servidor");
		lblModo.setFont(new Font("Marker Felt", Font.PLAIN, 19));
		lblModo.setBounds(32, 25, 233, 44);
		panel4.add(lblModo);
		
		JSeparator separator4 = new JSeparator();
		separator4.setBounds(19, 59, 597, 12);
		panel4.add(separator4);
		
		areaPantalla = new JTextArea();
		
		puerto = 9999;
		maxcon = 2;
		numcon = 0;
	   
		B = new barrier(maxcon);

	    // crear objeto DatagramSocket para enviar y recibir paquetes
	    try {
	    	socket = new ServerSocket(puerto);
	    }

	    // procesar los problemas que pueden ocurrir al crear el objeto DatagramSocket
	    catch( SocketException excepcionSocket ) {
	    	excepcionSocket.printStackTrace();
	    	System.exit( 1 );
	    }
		
		
		
		areaPantalla.setFont(new Font("Marker Felt", Font.PLAIN, 15));
		
		JScrollPane scrollPane = new JScrollPane(areaPantalla);
		scrollPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER);
		scrollPane.setViewportBorder(UIManager.getBorder("FormattedTextField.border"));
		scrollPane.setBounds(32, 93, 569, 223);
		panel4.add(scrollPane);
		
		JLabel lblEtsiiBuzz = new JLabel("Etsii BUZZ");
		lblEtsiiBuzz.setFont(new Font("Marker Felt", Font.PLAIN, 13));
		lblEtsiiBuzz.setBounds(520, 25, 81, 16);
		panel4.add(lblEtsiiBuzz);

		
	}

	/**
	 * 
	 */
	
	

	
	public static void main(String args[]) throws Exception {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					JuegoServidor frame = new JuegoServidor();
					frame.setVisible(true);
					frame.esperarPaquetes();
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
		
	} // main

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		 if (e.getSource() == btnCrear) {
			 panel1juego.setVisible(false);
			 panel2juego.setVisible(true); 
			 
		 } else if (e.getSource() == btnAceptarSer) {
			 panel2juego.setVisible(false);
			 servidor.setVisible(true);

			 
		 } else if (e.getSource() == btnIniciarJuego) {
			 try {
				System.out.println("ante de espero una coneccion");
				IniciarServidor(9999, 2);
				esperarPaquetes();
				System.out.println("despues deespero una coneccion");
				
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (Exception e2) {
				// TODO Auto-generated catch block
				e2.printStackTrace();
			}
		 }
	}
	
	
	
	
	




	private ServerSocket socket;
	private int puerto;
	private int maxcon; 
	private int numcon; 
	private barrier B;
	
	
	// api
	
	
	
	
 
		
		
		 
 
	
	public void IniciarServidor(int puerto_in, int maxcon_in) throws IOException {
		puerto = 9999;
		maxcon = 2;
		numcon = 0;
	   
		B = new barrier(maxcon);

	    // crear objeto DatagramSocket para enviar y recibir paquetes
	    try {
	    	socket = new ServerSocket(puerto);
	    }

	    // procesar los problemas que pueden ocurrir al crear el objeto DatagramSocket
	    catch( SocketException excepcionSocket ) {
	    	excepcionSocket.printStackTrace();
	    	System.exit( 1 );
	    }
	 } // fin del constructor de Servidor
	
	
 
	public synchronized void subnumcon() {
		escribirMensaje("Jugador ha abandonado a la partida.\n");
		numcon--;
	} // subnumcon

	private synchronized void addnumcon() throws Exception {
	 //escribirMensaje("Jugador se ha unido a la partida.\n");
		numcon++;
	} // addnumcon
 
 
 	// esperar a que lleguen los paquetes, mostrar los datos y repetir el paquete al cliente
 	public void esperarPaquetes() throws Exception {
 		while (true) { 			
 			while (numcon == maxcon) {
 				synchronized(this) {
 					try {
 					} catch (Exception e) {// Imprimir cualquier excepcion
 					}
 				}
 			} // while segundo
System.out.println("espero una coneccion");
 			SocketBytes SocketDatos = new SocketBytes(socket.accept());
 			addnumcon();        
 			// Arrancar hilo que atiende esta conexion por el Socket SocketDatos y recibe este objeto para actualizar
 			// el n�mero de conexiones libres.
 			//hilo h = new hilo(SocketDatos, this);
 			hilo h = new hilo(SocketDatos, this);
 	        h.start(); 
 			
 			
 			if(numcon==maxcon){
 				escribirMensaje("\nComienza la partida\n");
 				System.out.println("\nComienza la partida\n");
 				break;
 			}
 			
 			
 		} // while primero
 } // fin del método esperarPaquetes
 
 	public void escribirMensaje(String msg){
 		areaPantalla.setText(areaPantalla.getText() + msg);	 
 	}
 	
 	 private void mostrarMensaje( final String mensajeAMostrar ) {
 	    // mostrar el mensaje del subproceso de ejecución despachador de eventos
 	    SwingUtilities.invokeLater(
 	      new Runnable() {  // clase interna para asegurar que la GUI se actualice apropiadamente

 	          public void run() // actualiza areaPantalla
 	          {
 	             areaPantalla.append( mensajeAMostrar );
 	             areaPantalla.setCaretPosition( 
 	                areaPantalla.getText().length() );
 	          }

 	       }  // fin de la clase interna

 	    ); // fin de la llamada a SwingUtilities.invokeLater
 	 }

	
	
	
	
}
